import pandas as pd
import numpy as np

def demonstrate_duplicate_removal():
    """
    演示Pandas中删除重复数据的各种方法
    """
    print("=" * 50)
    print("Pandas删除重复数据完整示例")
    print("=" * 50)
    
    # 创建示例数据（包含重复行）
    data = {
        'Name': ['Alice', 'Bob', 'Alice', 'David', 'Bob', 'Eve', 'Alice'],
        'Age': [25, 30, 25, 35, 30, 40, 25],
        'City': ['NY', 'LA', 'NY', 'SF', 'LA', 'NY', 'NY'],
        'Salary': [50000, 60000, 50000, 70000, 60000, 80000, 50000]
    }
    
    df = pd.DataFrame(data)
    print("1. 原始数据:")
    print(df)
    print(f"原始数据形状: {df.shape}")
    print()
    
    # 2. 检测重复数据
    print("2. 检测重复数据")
    print("-" * 30)
    
    # 使用duplicated()检测完全重复的行
    df['完全重复标记'] = df.duplicated()
    print("完全重复行标记:")
    print(df[['Name', 'Age', 'City', '完全重复标记']])
    print()
    
    # 检测特定列的重复
    df['姓名城市重复标记'] = df.duplicated(subset=['Name', 'City'])
    print("姓名和城市重复标记:")
    print(df[df['姓名城市重复标记'] == True][['Name', 'City', '姓名城市重复标记']])
    print()
    
    # 3. 删除重复数据的不同方法
    print("3. 删除重复数据方法演示")
    print("-" * 40)
    
    # 方法1: 删除所有列的完全重复（默认保留第一个）
    df_clean1 = df.drop_duplicates()
    print("方法1 - 删除所有列完全重复:")
    print(df_clean1)
    print(f"去重后形状: {df_clean1.shape}")
    print()
    
    # 方法2: 根据特定列删除重复（按姓名和城市）
    df_clean2 = df.drop_duplicates(subset=['Name', 'City'])
    print("方法2 - 按姓名和城市去重:")
    print(df_clean2)
    print()
    
    # 方法3: 保留最后一次出现的重复项
    df_clean3 = df.drop_duplicates(subset=['Name', 'City'], keep='last')
    print("方法3 - 保留最后一次出现的重复项:")
    print(df_clean3)
    print()
    
    # 方法4: 删除所有重复项（不保留任何重复）
    df_clean4 = df.drop_duplicates(subset=['Name', 'City'], keep=False)
    print("方法4 - 删除所有重复项（只保留唯一项）:")
    print(df_clean4)
    print()
    
    # 4. 实际应用案例：用户数据清洗
    print("4. 实际案例：用户注册数据清洗")
    print("-" * 35)
    
    # 创建用户注册数据（包含时间戳）
    user_data = {
        'UserID': [101, 102, 101, 103, 102, 104],
        'UserName': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob', 'David'],
        'SignupDate': ['2023-01-01', '2023-01-02', '2023-01-03', 
                      '2023-01-04', '2023-01-05', '2023-01-06'],
        'Email': ['alice@email.com', 'bob@email.com', 'alice.new@email.com',
                 'charlie@email.com', 'bob.work@email.com', 'david@email.com']
    }
    
    user_df = pd.DataFrame(user_data)
    print("原始用户数据:")
    print(user_df)
    print()
    
    # 按UserID去重，保留最后一次注册记录（假设最新注册信息最准确）
    user_cleaned = user_df.sort_values('SignupDate').drop_duplicates(
        subset=['UserID'], keep='last'
    ).sort_index()
    
    print("清洗后用户数据（保留最新注册记录）:")
    print(user_cleaned)
    print()
    
    # 5. 高级技巧：结合排序确保去重逻辑一致性
    print("5. 高级技巧：排序后去重确保一致性")
    print("-" * 40)
    
    # 创建包含优先级的数据
    sales_data = {
        'Salesperson': ['John', 'John', 'Jane', 'Jane', 'Mike'],
        'SaleAmount': [1000, 1200, 800, 800, 1500],
        'SaleDate': ['2023-01-01', '2023-01-02', '2023-01-01', 
                    '2023-01-03', '2023-01-02'],
        'Commission': [100, 120, 80, 80, 150]
    }
    
    sales_df = pd.DataFrame(sales_data)
    print("原始销售数据:")
    print(sales_df)
    print()
    
    # 先按销售额降序排序，然后去重（保留销售额最高的记录）
    sales_deduplicated = sales_df.sort_values(
        'SaleAmount', ascending=False
    ).drop_duplicates(subset=['Salesperson']).sort_index()
    
    print("去重后销售数据（保留最高销售额记录）:")
    print(sales_deduplicated)
    
    return df, user_cleaned, sales_deduplicated

# 运行演示
if __name__ == "__main__":
    # 执行演示函数
    original_df, cleaned_users, cleaned_sales = demonstrate_duplicate_removal()
    
    print("\n" + "="*50)
    print("脚本执行完成！")
    print("="*50)
    print("\n关键方法总结:")
    print("1. df.duplicated() - 检测重复行")
    print("2. df.drop_duplicates() - 删除重复行") 
    print("3. 使用subset参数指定去重列")
    print("4. 使用keep参数控制保留策略（first/last/False）")
    print("5. 结合sort_values()确保去重逻辑一致性")